签名时,您需在用户AccessKey管理页面查看您当前账号的 AccessKeyId 和 AccessKeySecret,然后进行加密,用户也可在该页面手动关闭或开启签名机制。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
请按照下面的步骤对请求进行签名:
为了便于更好理解这个过程,每个步骤会以一个请求例子做演示,该请求例子的信息为:
accessKeyId=gk5d91BPqvBAe3ET&signatureNonce=225&other=anything
{"productId":100610,"name":"label"}
按参数名的字典顺序,对请求参数进行排序,包括公共请求参数(不包括 Signature 参数)和接口的自定义参数。 请求例子进行参数排序的结果为:
accessKeyId
other
signatureNonce
使用等号=连接请求参数名和参数值。
请求例子使用等号连接参数名和参数值的结果为:
accessKeyId=gk5d91BPqvBAe3ET
other=anything
signatureNonce=225
使用与号&连接请求参数,参数排序与步骤"排序参数" 的排序一致。
请求例子使用与号连接各请求信息对的结果为:
accessKeyId=gk5d91BPqvBAe3ET&other=anything&signatureNonce=225
在上一步处理得到的字符串后追加请求Body(JSON格式)参数内容。
请求例子追加Body的结果为:
accessKeyId=gk5d91BPqvBAe3ET&other=anything&signatureNonce=225{"productId":100610,"name":"label"}
对上一步处理得到的字符串进行 URL 编码,使用UTF-8字符集按照 RFC3986 规则编码整个字符串。编码规则如下:
如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中 URLEncoder.encode()编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换为波浪号~,即可得到上述规则描述的编码字符串。
private static final String ENCODING = "UTF-8";
private static String percentEncode(String value) throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
}
完成后,即获得规范化请求字符串(CanonicalizedQueryString)。
请求例子进行编码的结果为:
accessKeyId%3Dgk5d91BPqvBAe3ET%26other%3Danything%26signatureNonce%3D225%7B%22productId%22%3A100610%2C%22name%22%3A%22label%22%7D
加上请求方法构造完整的签名字符串。可参考如下规则:
StringToSign=
HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。
CanonicalizedQueryString//您的规范化请求字符串。
请求例子构造完整的签名字符串的结果为:
POST&%2F&accessKeyId%3Dgk5d91BPqvBAe3ET%26other%3Danything%26signatureNonce%3D225%7B%22productId%22%3A100610%2C%22name%22%3A%22label%22%7D
按照 RFC2104 的定义,使用步骤"构造签名字符串"得到的字符串StringToSign计算签名 HMAC 值,然后对其进行Base64编码得到完整的签名值,但最终只需保留其中的英文字母和数字。
signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
说明:计算签名时,使用的 Key 就是您的 AccessKeySecret 。使用的哈希算法是 SHA1。 请求例子(AccessKeySecret =DTcub5p6muj1mS53gGpHussjpCURjqWNyca6)完整签名内容为:
5AKR4k8cRkzPARPWm9Db1nLIYHU=
只保留其中的英文字母和数字:
5AKR4k8cRkzPARPWm9Db1nLIYHU
将得到的签名值作为 signature 请求参数值,即完成对请求签名的过程。 Query内容更新为:
accessKeyId=gk5d91BPqvBAe3ET&signatureNonce=225&signature=5AKR4k8cRkzPARPWm9Db1nLIYHU&other=anything
为了让用户更便捷地使用开放能力,我们目前提供两种生成签名的工具:windows-exe、java-sdk。
这是一个在windows平台运行的exe软件,用户在软件界面输入accessKeySecret、请求信息即可得到对应的签名值。使用方法:
解压exe4signature.zip压缩包;
双击运行文件夹里的SignatureTool.exe;
如有弹窗“This executable was created with an evaluation version of exe4j”,点击窗口的“确定”按钮;
按照提示,输入accessKeyId对应的accessKeySecret,并按回车,即可保存秘钥信息,可以通过重新运行SignatureTool.exe来更改accessKeySecret;
按照提示,输入本次请求信息,格式为:[大写Http method] + [空格1] + [请求参数] + [空格2] + [body内容],然后按回车即可得到签名值。(所有参数必须与请求里的信息完全一致,包括body里的换行信息等)
我们依然以“签名步骤”中的请求例子来举例,用户对应的输入是:
PUT accessKeyId=jNn7WmVg4ZakCe2i&signatureNonce=11&pageSize=5¤tPage=1&type=0 {"name": "any content"}
工具返回签名值,例如:
signature=UcPI3qNCkMVJqIQQmuMUzxtrYAY=
用户可以重复第5和第6步骤来重复不同请求信息的签名内容。
这是一个java sdk源代码包,自身也是一个maven项目,用户可以在自己的maven项目里添加sdk dependency来集成它。使用方法: